﻿#ifndef WIDGET_H
#define WIDGET_H

#include <QApplication>
#include <QWidget>
#include <applnk.h>
#include "inherentlnk.h"
#include "menuwidget.h"
#include "hublnk.h"
#include "lnkhandler.h"
#include <QSoundEffect>
#include "clock.h"
#include "settinghandler.h"


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    inline static QString get_program_dir()
    {
        if (program_dir == "" || program_dir == ".")
            program_dir = QApplication::applicationDirPath();
        if (program_dir == "")  // 如果获取失败了，就临时凑合一下
            program_dir = ".";

        return program_dir;
    }
    inline static QString get_icons_dir() {return get_program_dir() + "/icons/";}
    inline static QString get_setting_filepath() {return get_program_dir() + "/setting.xq";}
    inline LNKHandler* get_lnk_handler() {return lnk_handler;}
    inline void insert_lnk(qsizetype index, const QString& absolute_path)
    {
        lnk_handler->add_lnk(index, absolute_path);
    }

    inline MenuWidget* get_menu_ptr() {return menu_ptr;}
    inline HubLNK* get_hub_lnk() {return hub_lnk;}
    void open_file(const QString&, AppLNK* app_lnk=nullptr);
    void refresh_all();
    void change_menu_ptr(const QList<QString> &item_list);
    // 动画效果
    void animation_up();
    void animation_half();
    void animation_down();

    static bool start_in_cmd(const QString& );  // 在cmd运行bat脚本
    static int screen_height;  // 屏幕高度
    static int screen_width;  // 屏幕宽度

private:
    void init_sounds();
    void init_lnks();
    void show_top();  // 让窗口顶层显示
    void open_hub(HubLNK*);  // 打开hub
    inline void close_and_do_something();
    // 各种事件
    void paintEvent(QPaintEvent *);
    void enterEvent(QEnterEvent *);
    void leaveEvent(QEvent *);
    void dragEnterEvent(QDragEnterEvent *);
    void dropEvent(QDropEvent *);
    int press_y;
    bool this_is_move_window;
    void mousePressEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);

    SettingHandler* const setting_handler_ = SettingHandler::get_instance();
    static QString program_dir;  // 程序所在的目录
    Ui::Widget* ui;
    HubLNK* hub_lnk;
    LNKHandler* lnk_handler;  // 快捷方式管理器
    MenuWidget* menu_ptr;
    InherentLNK* my_computer_lnk;
    InherentLNK* rubbish_lnk;
    InherentLNK* setting_lnk;
    QSoundEffect* delete_sound;
    bool is_hide;
    bool temp_show;  // 有窗口全屏时的临时显示标志
    QTimer* temp_down_timer;  // 窗口临时显示的隐藏计时器
    bool mouse_is_in;  // 鼠标是否在本窗口里面
    Clock* clock_;  // 导航栏右侧时钟
    QTimer* timer_back_;
};
#endif // WIDGET_H
